// LogConfig.hh
// 统一日志配置管理器
// 统一管理所有日志系统的开关、格式、文件名等配置

#ifndef SERVICE_LOG_CONFIG_HH
#define SERVICE_LOG_CONFIG_HH

#include <string>
#include <cstdio>

// 日志模块枚举
enum class LogModule {
    ALL = 0,           // 所有模块
    MAIN,              // 主程序
    ENCODE,            // 编码层
    BUFFER,            // 缓冲层
    STREAM,            // 推流层
    SERVICE,           // 服务层
    RINGFIFO,          // 环形缓冲区
    RTSP,              // RTSP服务器
    VIDEO,             // 视频处理
    PERFORMANCE,       // 性能日志
    COUNT              // 模块数量
};

// 日志配置类（单例模式）
class LogConfig {
public:
    // 获取单例实例
    static LogConfig& getInstance();
    
    // 初始化配置（可选，使用默认值）
    void init();
    
    // 设置日志级别（全局）
    void setGlobalLevel(int level);  // 0=DEBUG, 1=INFO, 2=WARNING, 3=ERROR, 4=NONE
    
    // 获取日志级别（全局）
    int getGlobalLevel() const { return fGlobalLevel; }
    
    // 设置模块日志开关
    void setModuleEnabled(LogModule module, bool enabled);
    bool isModuleEnabled(LogModule module) const;
    
    // 设置日志输出文件
    void setLogFile(const std::string& filename);
    void setErrorLogFile(const std::string& filename);
    void setPerformanceLogFile(const std::string& filename);
    
    // 获取日志文件路径
    const std::string& getLogFile() const { return fLogFile; }
    const std::string& getErrorLogFile() const { return fErrorLogFile; }
    const std::string& getPerformanceLogFile() const { return fPerformanceLogFile; }
    
    // 设置日志格式选项
    void setShowTimestamp(bool show) { fShowTimestamp = show; }
    void setShowThreadId(bool show) { fShowThreadId = show; }
    void setShowFileName(bool show) { fShowFileName = show; }
    void setShowFunctionName(bool show) { fShowFunctionName = show; }
    void setShowLineNumber(bool show) { fShowLineNumber = show; }
    
    // 获取格式选项
    bool getShowTimestamp() const { return fShowTimestamp; }
    bool getShowThreadId() const { return fShowThreadId; }
    bool getShowFileName() const { return fShowFileName; }
    bool getShowFunctionName() const { return fShowFunctionName; }
    bool getShowLineNumber() const { return fShowLineNumber; }
    
    // 设置是否启用日志（全局开关）
    void setLoggingEnabled(bool enabled) { fLoggingEnabled = enabled; }
    bool isLoggingEnabled() const { return fLoggingEnabled; }
    
    // 从环境变量或配置文件加载配置
    void loadFromEnvironment();
    
    // 获取模块名称字符串
    static const char* getModuleName(LogModule module);
    
private:
    LogConfig();
    ~LogConfig();
    LogConfig(const LogConfig&) = delete;
    LogConfig& operator=(const LogConfig&) = delete;
    
    // 配置数据
    int fGlobalLevel;                    // 全局日志级别
    bool fModuleEnabled[(int)LogModule::COUNT];  // 各模块开关
    std::string fLogFile;                // 主日志文件
    std::string fErrorLogFile;           // 错误日志文件
    std::string fPerformanceLogFile;     // 性能日志文件
    bool fShowTimestamp;                 // 显示时间戳
    bool fShowThreadId;                  // 显示线程ID
    bool fShowFileName;                  // 显示文件名
    bool fShowFunctionName;              // 显示函数名
    bool fShowLineNumber;                // 显示行号
    bool fLoggingEnabled;                // 日志总开关
};

// 便捷宏：检查模块是否启用
#define LOG_MODULE_ENABLED(module) LogConfig::getInstance().isModuleEnabled(LogModule::module)
#define LOG_IS_ENABLED() LogConfig::getInstance().isLoggingEnabled()

#endif // SERVICE_LOG_CONFIG_HH

